package com.bd.scm.dao.mapper.leave;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bd.scm.domain.dto.common.FailDto;
import com.bd.scm.domain.dto.leave.*;
import com.bd.scm.domain.dto.user.PersonnelFilesDto;
import com.bd.scm.domain.dto.user.UserOfLeaveBatchDto;
import com.bd.scm.domain.models.leave.*;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * <p>
 * 请假单 Mapper 接口
 * </p>
 *
 * @author Mason
 * @since 2019-12-09
 */
public interface BdLeaveOrderMapper extends BaseMapper<BdLeaveOrder> {
    /**
     * 获取批量请假申请单列表.
     *
     * @param page                  分页信息
     * @param bdLeaveOrderSerachDto 查询条件
     * @return
     */
    IPage<BdLeaveOrderDto> getBdLeaveOrderList(Page<BdLeaveOrderDto> page, BdLeaveOrderSerachDto bdLeaveOrderSerachDto);

    /**
     * 获取详单人员.
     *
     * @param bdLeaveOrderSerachDto 条件
     * @return
     */
    List<PersonnelFilesDto> getUsersOfOrder(BdLeaveOrderSerachDto bdLeaveOrderSerachDto);

    /**
     * 保存选择的人员到临时表.
     *
     * @param list
     */
    void insertUserOfLeaveBatch(@Param("list") List<UserOfLeaveBatchDto> list);

    /**
     * 保存选择的日期到临时表.
     *
     * @param list
     */
    void insertDayDeteil(@Param("list") List<DayDetailedOfLeaveDto> list);

    /**
     * 调用请假存储过程.
     *
     * @param leave
     */
    List<FailDto> saveLeave(@Param("leave") String leave);

    /**
     * 获取请假个人的列表.
     *
     * @param bdLeaveOrderSerachDto 条件
     * @return
     */
    IPage<LeaveOfPersonalDto> getLeaveOfPersonalList(Page<LeaveOfPersonalDto> page, BdLeaveOrderSerachDto
            bdLeaveOrderSerachDto);

    /**
     * 根据单子ID修改单子状态和审批人.
     *
     * @param orderId
     * @param status
     * @param approver
     */
    void updateLeaveOrder(@Param("orderId") String orderId, @Param("status") Integer status, @Param("approver")
            String approver, @Param("remark")
                                  String remark);

    /**
     * 根据单子ID修改单子状态
     *
     * @param orderId
     * @param status
     */
    void updateAttendanceCardLeaveOrder(@Param("orderId") String orderId, @Param("status") Integer status);

    /**
     * 审批后数据处理.
     *
     * @param orderId
     * @param status
     */
    void updateDataByLeave(@Param("orderId") String orderId, @Param("status") Integer status,
                           @Param("approver") String approver);

    /**
     * 删除单子（逻辑）
     *
     * @param orderId
     */
    void cancelLeaveOrder(@Param("orderId") Integer orderId,
                          @Param("deleteLeaveParamDto") DeleteLeaveParamDto deleteLeaveParamDto);

    /**
     * 根据单子id获取实例ID
     *
     * @param orderId
     * @return
     */
    String getProcessInstanceId(@Param("orderId") Integer orderId);

    /**
     * 导出
     *
     * @param bdLeaveOrderSerachDto
     * @return
     */
    List<LeaveExport> exportLeaveOrder(@Param("param2") BdLeaveOrderSerachDto bdLeaveOrderSerachDto);

    /**
     * 导出个人
     *
     * @param bdLeaveOrderSerachDto
     * @return
     */
    List<LeavePersonalExport> exportLeaveOrderPersonal(@Param("param2") BdLeaveOrderSerachDto bdLeaveOrderSerachDto);

    /**
     * 假期每日重新计算.
     */
    void leaveDeductJob();

    /**
     *
     */
    Integer getOrderNoByFz(String orderNo);

    /**
     * 保存导入的数据.
     *
     * @param receiveList
     * @param serialNumber
     * @param operator
     */
    void saveImportFile(@Param("list") List<ImportLeaveDataDto> receiveList, @Param("serialNumber") String serialNumber,
                        @Param("operator") String operator);

    /**
     * @param serialNumber
     * @param operator
     * @return
     */
    List<ImportLeaveFailDto> execImportLeave(@Param("serialNumber") String serialNumber,
                                             @Param("operator") String operator);

    /**
     * 获取员工指定日期的记录记录
     *
     * @param query
     * @return
     */
    List<LeaveView> getLeaveByCondition(@Param(Constants.WRAPPER) QueryWrapper<BdLeaveOrderSerachDto> query);

    /**
     * 获取请假单列表分页数据
     *
     * @param query
     * @return
     */
    List<BdLeaveOrderDto> getListByPage(@Param("query") BdLeaveOrderSerachDto query);


    /**
     * 获取请假导出数据
     *
     * @param query
     * @return
     */
    List<LeaveView> getExportListByPage(@Param("query") BdLeaveOrderSerachDto query);

}
